This is a migrated thread and some comments may be shown as answers.

setting data-value-primitive="false" has no effect

3 Answers 1004 Views
DropDownList
This is a migrated thread and some comments may be shown as answers.
Maxim
Top achievements
Rank 1
Maxim asked on 14 Dec 2015, 06:21 PM

Hi,

I would expect that setting data-value-primitive="false" will override default behavior, however it appears that it does not work unless value is initialized to object. I would be really surprises is this is expected behavior. Would you please elaborate on this.

 

Thank you,

Maxim

3 Answers, 1 is accepted

Sort by
0
Georgi Krustev
Telerik team
answered on 16 Dec 2015, 09:44 AM
Hello Maxim,

By default valuePrimitive option is false. That being said, it will set the model field to the selected object. Could you please send us a code excerpt that demonstrate the problematic behavior you are referring to?

Regards,
Georgi Krustev
Telerik
 
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
 
0
Maxim
Top achievements
Rank 1
answered on 16 Dec 2015, 03:27 PM

Hello Georgi,

Please review the sample code that demonstrates this issue. As you can see from the sample, changing a selected value in the dropdown incorrectly changes the bound field. Based on documentaiton, the bound field should be maintained as a complex object when data-value-primitive is set to false.

 

Thanks,

Maxim

 

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Untitled</title>
 
 
  <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<body>
  <div id="sample">
    <form>
      <input data-role="dropdownlist"
             data-text-field="ProductName"
             data-value-field="ProductID"
             data-auto-bind="false"
             data-value-primitive="false"
             data-bind="value: product, source: products"/>
    </form>
    <pre id="model-state"></pre>
  </div>
  <script>
    'use strict';
    $(function(){
      var
        ObservableObject = kendo.data.ObservableObject,
        DataSource = kendo.data.DataSource,
        state = $("#model-state");
        (function(objProto){
          var DataSource = kendo.data.DataSource;
          var stringify = kendo.stringify;
          if (!objProto.prototype.stringify) {
              (function () {
                  function replacer(key, value) {
                      if (value instanceof DataSource) {
                          return undefined;
                      }
                      return value;
                  };
                  objProto.prototype.stringify = function () {
                      return stringify(this, replacer, 2);
                  };
 
              }());
          }
        }(kendo.Class));
       
      var Model = ObservableObject.extend({
            init: function(id) {
            var that = this;
            ObservableObject.fn.init.call(that,{
              product: null,
              products: new DataSource({
                  transport: {
                    read: {
                      dataType: "jsonp",
                      url: "//demos.telerik.com/kendo-ui/service/Products",
                    }
                  },
                  schema: {
                      model: {
                          id: "ProductID",
                          fields: {
                              ProductID: { type: "number" }
                          }
                      }
                  }
                })
            });
             
            that.bind("get", function (e) {
              var field = e.field;
              if (!this[e.field]) {
                this[e.field] = function (item) {
                  return 0;
                };
              }
            });
             
            that.bind("change", function (e) {
              state.text(that.stringify());
            });
 
            that.products.fetch(function () {
              that.set("product", this.get(id));
            });
          }
      });
      kendo.bind("#sample", new Model(1));
    });
  </script>
</body>
</html>

0
Georgi Krustev
Telerik team
answered on 18 Dec 2015, 12:11 PM
Hello Maxim,

Thank you for the repro demo. Indeed, when the value is a primitive value, the valuePrimitive option will not force the binding to set it to an object. This is current implementation approach and we do not have plans to change it for now.

Your demo changes the objects to numbers, because the custom get function returns "0" values instead of nulls. If we start returning nulls for "product" field, then the widget works as expected:
Please avoid returning primitive values when you would like to use objects.

Regards,
Georgi Krustev
Telerik
 
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
 
Tags
DropDownList
Asked by
Maxim
Top achievements
Rank 1
Answers by
Georgi Krustev
Telerik team
Maxim
Top achievements
Rank 1
Share this question
or