【问题标题】:Unable to process binding in devextreme / knockout无法在 devextreme / 淘汰赛中处理绑定
【发布时间】:2014-05-06 12:36:47
【问题描述】:

我有另一个函数从服务器调用“GetEmployee”函数,当我在 Chrome 调试器中检查调用时,我可以看到我的详细信息按预期通过,所以这不是服务器端错误。

但是,如果我在quickBookingSource 的第三行放置断点,则永远不会到达断点。我确实在 viewModel 定义中有quickBooking:quickBookingSource 并且没有拼写错误。

另外,你会看到我添加了一个带有“blah”文本的三元运算符作为安全网,但无济于事

我得到的错误信息是:

    Uncaught ReferenceError: Unable to process binding "text: function (){return project }"
Message: project is not defined 

代码是:

HTML

<div data-bind="dxTileView: {listHeight:tileWidgetHeight,itemClickAction:sendProject,baseItemHeight: 80, baseItemWidth: 100,dataSource:quickBooking}">
            <div data-options="dxTemplate : { name:'item' }" class="tile">
                <h2 data-bind="text: project"></h2>
                <p data-bind="text: name"></p>
                <p data-bind="text: costCenter"></p>
                <p>Jetzt Büchen</p>
            </div>
</div>

JS

var quickBookingSource = DevExpress.data.createDataSource({
        load: function (loadOptions) {
            if (loadOptions.refresh) {
                var deferred = new $.Deferred();
                callService("GetEmployee",
                    {
                        employeeNo: aktivEmployee.id
                    },
                function (result) {
                    var mapped = $.map(result, function (data) {
                        return {
                            name: data.LastNProjects? data.LastNProjects["Name"]:"blah",
                            project: data.LastNProjects? data.LastNProjects["Address"]:"blah",
                            costCenter: data.LastNCostCenters? data.LastNCostCenters["Name"]:"blah"
                        }
                    });
                    deferred.resolve(mapped);
                });
                return deferred.promise();
            }
        },
    });

提前致谢

【问题讨论】:

  • 项目属性是可观察的吗?来自 quickBookingSource 的数据是否被放入绑定到 HTML 的主 ViewModel 上的 observable 中?
  • @William 项目不是可观察的。我主要从同一个项目中另一个视图的 tilewidget 复制代码,工作正常。
  • 这个错误听起来像是 KO 在绑定到 UI 的 VM 上寻找一个可观察的命名项目,但找不到它。你的视图模型是什么样的?

标签: javascript knockout.js devextreme


【解决方案1】:

我在下面的小提琴http://jsfiddle.net/tabalinas/7aSS7/中复制了你的案例。

使用 setTimeout 模拟对服务器的请求。 您可以单击刷新按钮重新加载数据源。该演示表明您的代码可以正常工作。如果服务器代码没问题,似乎问题出在幕后的客户端代码中。

<div class="dx-viewport dx-theme-ios dx-version-major-6 dx-theme-ios-typography">
    <div data-bind="dxButton: { text: 'Refresh', clickAction: reloadData }"></div>
    <span data-bind="visible: loading">Loading ...</span>
    <div data-bind="dxTileView: { listHeight: tileWidgetHeight, itemClickAction: sendProject, baseItemHeight: 200, baseItemWidth: 100, dataSource: quickBooking }">
        <div data-options="dxTemplate : { name:'item' }" class="tile">
            <h2 data-bind="text: project"></h2>
            <p data-bind="text: name"></p>
            <p data-bind="text: costCenter"></p>
            <p>Jetzt Büchen</p>
        </div>
    </div>
</div>

// stub service call
var callService = function(method, data, success) {
    var fakeData = [
        { LastNProjects: { Name: 'test project1' }, LastNCostCenters: { Name: 'cost center1' }},
        { LastNProjects: { Name: 'test project2' }, LastNCostCenters: { Name: 'cost center2' }},
        { LastNProjects: { Name: 'test project3' }, LastNCostCenters: { Name: 'cost center3' }},
        { LastNProjects: { Name: 'test project4' }, LastNCostCenters: { Name: 'cost center4' }}
    ];

    setTimeout(function() { 
        success(fakeData);
    }, 1500);
};

var quickBookingSource = DevExpress.data.createDataSource({
    load: function (loadOptions) {
        vm.loading(true);
        if (loadOptions.refresh) {
            var deferred = new $.Deferred();
            callService("GetEmployee",
                        {
                            employeeNo: 'id'
                        },
                        function (result) {
                            var mapped = $.map(result, function (data) {
                                return {
                                    name: data.LastNProjects? data.LastNProjects["Name"]:"blah",
                                    project: data.LastNProjects? data.LastNProjects["Address"]:"blah",
                                    costCenter: data.LastNCostCenters? data.LastNCostCenters["Name"]:"blah"
                                }
                            });
                            deferred.resolve(mapped);
                            vm.loading(false);
                        });
            return deferred.promise();
        }
    },
});


var vm = {

    loading: ko.observable(false),

    reloadData: function() {
        quickBookingSource.load();
    },

    tileWidgetHeight: 300,

    quickBooking: quickBookingSource,

    sendProject: function(args) {
        console.log("send " + args.itemData.name);
    }
};

ko.applyBindings(vm);

【讨论】:

  • 哦……裤子。为了使代码对你们来说尽可能可读,我缩短了一些错误所在的 HTML。我在数据绑定字符串的双引号中有双引号。我是个白痴。感谢大家的时间
猜你喜欢
  • 2014-11-29
  • 2016-01-22
  • 2015-03-23
  • 2014-05-29
  • 2017-10-24
  • 2015-03-17
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多